import fs from "fs/promises";
import Layout from "@/layouts/Layout.astro";
import Header from "@/components/Header.astro";
import ChaptersPopover from "@/components/ChaptersPopover.astro";
import { BIBLES, BOOKS } from "@/consts";
import BooksPopover from "@/components/BooksPopover.astro";
import BiblesPopover from "@/components/BiblesPopover.astro";
export async function getStaticPaths() {
for (const bible of BIBLES) {
const file = await fs.readFile(`${process.cwd()}/../composeApp/src/commonMain/composeResources/files/${bible.filename}`, "utf-8");
.map((line) => line.split("|"))
const [bookName, bookIndexStr, chapterIndexStr, verseIndex, title, text] = item;
const bookIndex = parseInt(bookIndexStr, 10);
const chapterIndex = parseInt(chapterIndexStr, 10);
const key = `${bible.version}/${bookIndexStr}/${chapterIndex + 1}`;
book: Object.keys(BOOKS)[bookIndex],
chapter: chapterIndex + 1,
data[key].props.verses.push({
verse: parseInt(verseIndex, 10) + 1,
return Object.values(data);
const { bible, book, chapter } = Astro.params;
const { localBookName, verses } = Astro.props;
<Header {bible} {book} {chapter} {localBookName} />
<div id="content" class="content">
{verses.map(({ book, verse, title, text }) => (
<h2>{title && <strong set:html={title} /> <br />}</h2>
<p id={`verse-${verse}`}>
<span class="verse-no">{verse}</span>. {text}
<BiblesPopover {book} {chapter} />
<ChaptersPopover {bible} {book} />
<script is:inline define:vars={{ bible, book, chapter }}>
localStorage.setItem("last_visited", `/bibles/${bible}/${book}/${chapter}`);
const mapping = JSON.parse(localStorage.getItem(`${book}:${chapter}`) || "{}");
Object.keys(mapping).forEach((key) => {
const element = document.getElementById(`verse-${key}`);
element.style.backgroundColor = "var(--color-highlight-bg)";
const hammertime = new Hammer(document.getElementById("content"));
direction: Hammer.DIRECTION_HORIZONTAL,
hammertime.on("swipeleft", function () {
const link = document.createElement("a");
link.href = `/bibles/${bible}/${book}/${parseInt(chapter, 10) + 1}`;
hammertime.on("swiperight", function () {
const link = document.createElement("a");
link.href = `/bibles/${bible}/${book}/${parseInt(chapter, 10) - 1}`;
background-color: var(--color-body-bg);
color: var(--color-text);
font-family: var(--font-roboto);
text-rendering: optimizeLegibility;
font-variant-ligatures: common-ligatures;
@media (max-width: 720px) {
color: var(--color-verse-no);